Add support for SCMI AP core configuration protocol v1.0
authorDimitris Papastamos <[email protected]>
Tue, 3 Apr 2018 13:58:17 +0000 (14:58 +0100)
committerDimitris Papastamos <[email protected]>
Thu, 12 Jul 2018 09:09:12 +0000 (10:09 +0100)
Change-Id: If07000b6b19011e960336a305a784dd643301b97
Signed-off-by: Dimitris Papastamos <[email protected]>
plat/arm/css/common/css_common.mk
plat/arm/css/drivers/scmi/scmi.h
plat/arm/css/drivers/scmi/scmi_ap_core_proto.c [new file with mode: 0644]
plat/arm/css/drivers/scmi/scmi_private.h

index 72d5527b65d0680ba76778731e0de77eb3008bd0..29dd01d19c340c04a0dfab174bba7d08fb8d9bbc 100644 (file)
@@ -32,6 +32,7 @@ BL31_SOURCES          +=      plat/arm/css/drivers/scp/css_pm_scpi.c          \
                                plat/arm/css/drivers/scpi/css_scpi.c
 else
 BL31_SOURCES           +=      plat/arm/css/drivers/scp/css_pm_scmi.c          \
+                               plat/arm/css/drivers/scmi/scmi_ap_core_proto.c  \
                                plat/arm/css/drivers/scmi/scmi_common.c         \
                                plat/arm/css/drivers/scmi/scmi_pwr_dmn_proto.c  \
                                plat/arm/css/drivers/scmi/scmi_sys_pwr_proto.c  \
index cf9ef5e9a00054254cfcbcb2442ad1b31a5ec029..723fd06edc21e5470bbc445717c258a44e82cc5b 100644 (file)
@@ -12,6 +12,7 @@
 #include <stdint.h>
 
 /* Supported SCMI Protocol Versions */
+#define SCMI_AP_CORE_PROTO_VER                 MAKE_SCMI_VERSION(1, 0)
 #define SCMI_PWR_DMN_PROTO_VER                 MAKE_SCMI_VERSION(1, 0)
 #define SCMI_SYS_PWR_PROTO_VER                 MAKE_SCMI_VERSION(1, 0)
 
@@ -29,6 +30,8 @@
 /* SCMI Protocol identifiers */
 #define SCMI_PWR_DMN_PROTO_ID                  0x11
 #define SCMI_SYS_PWR_PROTO_ID                  0x12
+/* The AP core protocol is a CSS platform-specific extension */
+#define SCMI_AP_CORE_PROTO_ID                  0x90
 
 /* Mandatory messages IDs for all SCMI protocols */
 #define SCMI_PROTO_VERSION_MSG                 0x0
 #define SCMI_SYS_PWR_STATE_SET_MSG             0x3
 #define SCMI_SYS_PWR_STATE_GET_MSG             0x4
 
+/* SCMI AP core protocol message IDs */
+#define SCMI_AP_CORE_RESET_ADDR_SET_MSG                0x3
+#define SCMI_AP_CORE_RESET_ADDR_GET_MSG                0x4
+
 /* Helper macros for system power management protocol commands */
 
 /*
 #define SCMI_SYS_PWR_POWER_UP                  0x3
 #define SCMI_SYS_PWR_SUSPEND                   0x4
 
+/*
+ * Macros to describe the bit-fields of the `attribute` of AP core protocol
+ * AP_CORE_RESET_ADDR set/get messages.
+ */
+#define SCMI_AP_CORE_LOCK_ATTR_SHIFT           0x0
+#define SCMI_AP_CORE_LOCK_ATTR                 (1U << SCMI_AP_CORE_LOCK_ATTR_SHIFT)
+
 /* SCMI Error code definitions */
 #define SCMI_E_QUEUED                  1
 #define SCMI_E_SUCCESS                 0
@@ -133,4 +147,8 @@ int scmi_pwr_state_get(void *p, uint32_t domain_id, uint32_t *scmi_pwr_state);
 int scmi_sys_pwr_state_set(void *p, uint32_t flags, uint32_t system_state);
 int scmi_sys_pwr_state_get(void *p, uint32_t *system_state);
 
+/* SCMI AP core configuration protocol commands. */
+int scmi_ap_core_set_reset_addr(void *p, uint64_t reset_addr, uint32_t attr);
+int scmi_ap_core_get_reset_addr(void *p, uint64_t *reset_addr, uint32_t *attr);
+
 #endif /* __CSS_SCMI_H__ */
diff --git a/plat/arm/css/drivers/scmi/scmi_ap_core_proto.c b/plat/arm/css/drivers/scmi/scmi_ap_core_proto.c
new file mode 100644 (file)
index 0000000..1438cba
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 2018, ARM Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <arch_helpers.h>
+#include <assert.h>
+#include <debug.h>
+#include "scmi.h"
+#include "scmi_private.h"
+
+/*
+ * API to set the SCMI AP core reset address and attributes
+ */
+int scmi_ap_core_set_reset_addr(void *p, uint64_t reset_addr, uint32_t attr)
+{
+       mailbox_mem_t *mbx_mem;
+       int token = 0, ret;
+       scmi_channel_t *ch = (scmi_channel_t *)p;
+
+       validate_scmi_channel(ch);
+
+       scmi_get_channel(ch);
+
+       mbx_mem = (mailbox_mem_t *)(ch->info->scmi_mbx_mem);
+       mbx_mem->msg_header = SCMI_MSG_CREATE(SCMI_AP_CORE_PROTO_ID,
+                       SCMI_AP_CORE_RESET_ADDR_SET_MSG, token);
+       mbx_mem->len = SCMI_AP_CORE_RESET_ADDR_SET_MSG_LEN;
+       mbx_mem->flags = SCMI_FLAG_RESP_POLL;
+       SCMI_PAYLOAD_ARG3(mbx_mem->payload, reset_addr & 0xffffffff,
+               reset_addr >> 32, attr);
+
+       scmi_send_sync_command(ch);
+
+       /* Get the return values */
+       SCMI_PAYLOAD_RET_VAL1(mbx_mem->payload, ret);
+       assert(mbx_mem->len == SCMI_AP_CORE_RESET_ADDR_SET_RESP_LEN);
+       assert(token == SCMI_MSG_GET_TOKEN(mbx_mem->msg_header));
+
+       scmi_put_channel(ch);
+
+       return ret;
+}
+
+/*
+ * API to get the SCMI AP core reset address and attributes
+ */
+int scmi_ap_core_get_reset_addr(void *p, uint64_t *reset_addr, uint32_t *attr)
+{
+       mailbox_mem_t *mbx_mem;
+       int token = 0, ret;
+       scmi_channel_t *ch = (scmi_channel_t *)p;
+       uint32_t lo_addr, hi_addr;
+
+       validate_scmi_channel(ch);
+
+       scmi_get_channel(ch);
+
+       mbx_mem = (mailbox_mem_t *)(ch->info->scmi_mbx_mem);
+       mbx_mem->msg_header = SCMI_MSG_CREATE(SCMI_AP_CORE_PROTO_ID,
+                       SCMI_AP_CORE_RESET_ADDR_GET_MSG, token);
+       mbx_mem->len = SCMI_AP_CORE_RESET_ADDR_GET_MSG_LEN;
+       mbx_mem->flags = SCMI_FLAG_RESP_POLL;
+
+       scmi_send_sync_command(ch);
+
+       /* Get the return values */
+       SCMI_PAYLOAD_RET_VAL4(mbx_mem->payload, ret, lo_addr, hi_addr, *attr);
+       *reset_addr = lo_addr | (uint64_t)hi_addr << 32;
+       assert(mbx_mem->len == SCMI_AP_CORE_RESET_ADDR_GET_RESP_LEN);
+       assert(token == SCMI_MSG_GET_TOKEN(mbx_mem->msg_header));
+
+       scmi_put_channel(ch);
+
+       return ret;
+}
index 67fe7481ff48085b6cc4f7288933881a3f6b6682..39bc8ccb34df6e7d45f5d8d7bf84245183f5258a 100644 (file)
 #define SCMI_PROTO_MSG_ATTR_MSG_LEN            8
 #define SCMI_PROTO_MSG_ATTR_RESP_LEN           12
 
+#define SCMI_AP_CORE_RESET_ADDR_SET_MSG_LEN    16
+#define SCMI_AP_CORE_RESET_ADDR_SET_RESP_LEN   8
+
+#define SCMI_AP_CORE_RESET_ADDR_GET_MSG_LEN    4
+#define SCMI_AP_CORE_RESET_ADDR_GET_RESP_LEN   20
+
 #define SCMI_PWR_STATE_SET_MSG_LEN             16
 #define SCMI_PWR_STATE_SET_RESP_LEN            8
 
                (val3) = mmio_read_32((uintptr_t)&payld_arr[2]);        \
        } while (0)
 
+#define SCMI_PAYLOAD_RET_VAL4(payld_arr, val1, val2, val3, val4)       do {    \
+               SCMI_PAYLOAD_RET_VAL3(payld_arr, val1, val2, val3);             \
+               (val4) = mmio_read_32((uintptr_t)&payld_arr[3]);                \
+       } while (0)
+
 /*
  * Private data structure for representing the mailbox memory layout. Refer
  * the SCMI specification for more details.